package com.lohika.vvrublevskyy.dao.impl;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;
import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;

import com.lohika.vvrublevskyy.dao.GenericDao;
import org.springframework.stereotype.Repository;

@Repository
public abstract class GenericDaoImpl<E> implements GenericDao<E> {

	private Class<E> type;
	private RowMapper<E> rowMapper;
	
	protected NamedParameterJdbcTemplate jdbcTemplate;
	
	/*Template method*/
	abstract String getTableName();

    @Resource(name = "dataSource")
	public void setDataSource(DataSource dataSource) {
		jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
	}

	public GenericDaoImpl() {
		Type t = getClass().getGenericSuperclass();
		ParameterizedType pt = (ParameterizedType) t;
		type = (Class) pt.getActualTypeArguments()[0];
	}
	
	
	
	@Override
	public void delete(long id) {
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("ID", id);
		
		//Питання: Чи нормальний такий підхід у формуванні запиту
		String sql = new StringBuilder()
				.append("DELETE FROM ")
				.append( getTableName() )
				.append(" WHERE id=:ID")
				.toString();
		
		jdbcTemplate.update(sql, new MapSqlParameterSource(parameters));
	}

}
